//: [Previous](@previous)

/*:
 [135] 分发糖果 (分配问题：Hard)
 老师想给孩子们分发糖果，有 N 个孩子站成了一条直线，老师会根据每个孩子的表现，预先给他们评分。

 你需要按照以下要求，帮助老师给这些孩子分发糖果：

 每个孩子至少分配到 1 个糖果。
 评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。
 那么这样下来，老师至少需要准备多少颗糖果呢？

 ```
 输入：[1,0,2]
 输出：5
 解释：你可以分别给这三个孩子分发 2、1、2 颗糖果。
 ```

 只需要简单的两次遍历即可:把所有孩子的糖果数初始化为 1; 先从左往右遍历一遍，如果右边孩子的评分比左边的高，则右边孩子的糖果数更新为左边孩子的 糖果数加 1;再从右往左遍历一遍，如果左边孩子的评分比右边的高，且左边孩子当前的糖果数 不大于右边孩子的糖果数，则左边孩子的糖果数更新为右边孩子的糖果数加 1。通过这两次遍历， 分配的糖果就可以满足题目要求了。这里的贪心策略即为，在每次遍历中，只考虑并更新相邻一 侧的大小关系。
 */

import Foundation

class Solution {
    static func candy(_ ratings: [Int]) -> Int {
        var candys: [Int] = Array(repeating: 1, count: ratings.count)
        for i in 1..<ratings.count {
            if ratings[i] > ratings[i-1] {
                candys[i] = candys[i-1] + 1
            }
        }
        print(candys)
        for i in (1..<ratings.count).reversed() {
            if ratings[i] < ratings[i-1] {
                candys[i-1] = max(candys[i-1], candys[i] + 1)
            }
        }
        print(candys)

        return candys.reduce(0, +)
    }
}

print(Solution.candy([1,3,2,2,1]))

//: [Next](@next)
